package com;

import java.util.HashMap;

/**
 * 
 * @author litianyi
 *
 * 2015年9月10日
 * 
 * 在Java内存模型中，有main memory，每个线程也有自己的memory (例如寄存器)。
 * 为了性能，一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间，
 * 在一个线程的memory中的值可能与另外一个线程memory中的值，或者main memory中的值不一致的情况。
 * 一个变量声明为volatile，就意味着这个变量是随时会被其他线程修改的，因此不能将它cache在线程memory中。
 */
public class  VolatileTest {

	volatile boolean  a = false;
	volatile int proccess;
	
	
	
	public static void main(String[] args) throws InterruptedException {
		
		VolatileTest t = new VolatileTest();
		t.downLoad();
	}
	
	/**
	 * 假如pleaseStop没有被声明为volatile，线程执行run的时候检查的是自己的副本，
	 * 就不能及时得知其他线程已经调用
	 * @throws InterruptedException
	 */
	public void test() throws InterruptedException{
		
		
		new Thread(new Runnable() {
					
					@Override
					public void run() {
							while(a!=true){
								
							}
						}
		}).start();
		
		Thread.sleep(2000);
		a = true;
		
	}
	

	/**
	 *  
	 *  测试一个下载场景，后台下载，前台去读下载进度
	 */
	public void downLoad(){
		
	
		
		
		new Thread(new Runnable() {
			public void run() {
				
				while(proccess < 5){
			
					    proccess++;

					try {
						Thread.currentThread().sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				
				
			}
		}).start();
		
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				while (proccess<=5) {
					
					if(proccess==5){
						System.out.println("下载完毕");
						return;
					}else{
						System.out.println("当前下载进度="+proccess+"%");
					}
					
					try {
						Thread.currentThread().sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
				
			}
		}).start();
		
		
	}
	
	
	
}
